﻿using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data;
using System.Text;
using Sinacor.Infra.Service.Data;
using Sinacor.Infra.Service.Security.Authorization;
using Sinacor.Infra.Service.Common;

namespace Sinacor.Servico.Bovespa.Movimento.ResourceAccess
{
    public class ControleMovimento : BaseResourceAccess
    {
        #region Construtor

        /// <summary>
        /// Construtor
        /// </summary>
        public ControleMovimento() : base(AuthorizationContext.Current.CompanyId) { }

        #endregion

        #region Métodos Públicos

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public BusinessEntity.Resultado CalcularDataAberturaMovimento(BusinessEntity.Parameter.SistemaBovespa request)
        {
            #region Comando SQL

            BusinessEntity.Resultado resultado = new BusinessEntity.Resultado();
            StringBuilder sql = new StringBuilder();

            sql.Append("DECLARE rettype BOOLEAN; ");
            sql.Append("BEGIN ");
            sql.Append("rettype:= pOr_Calend.fOr_CalcNovaData (:P_sCdSistema,:R_sNovaData,:R_nErro,:R_sErro,:R_sArgs);");
            sql.Append("IF rettype THEN :R_Retorno := 1; ELSE :R_Retorno := 0; END IF; ");
            sql.Append("END; ");

            using (DbCommand dbCommand = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                #region Adição dos parâmetros

                DbParameter parametroP_sCdSistema = dbCommand.CreateParameter();
                parametroP_sCdSistema.ParameterName = "P_sCdSistema";
                parametroP_sCdSistema.Direction = ParameterDirection.Input;
                parametroP_sCdSistema.DbType = DbType.String;
                parametroP_sCdSistema.Value = EnumConverter.ToString<BusinessEntity.Enum.TipoSistema>(request.Sistema);

                dbCommand.Parameters.Add(parametroP_sCdSistema);

                DbParameter parametroR_sNovaData = dbCommand.CreateParameter();
                parametroR_sNovaData.ParameterName = "R_sNovaData";
                parametroR_sNovaData.Direction = ParameterDirection.Output;
                parametroR_sNovaData.DbType = DbType.String;
                parametroR_sNovaData.Size = 4000;
                parametroR_sNovaData.Value = null;

                dbCommand.Parameters.Add(parametroR_sNovaData);

                DbParameter parametroR_nErro = dbCommand.CreateParameter();
                parametroR_nErro.ParameterName = "R_nErro";
                parametroR_nErro.Direction = ParameterDirection.Output;
                parametroR_nErro.DbType = DbType.Int32;
                parametroR_nErro.Value = 0;

                dbCommand.Parameters.Add(parametroR_nErro);

                DbParameter parametroR_sErro = dbCommand.CreateParameter();
                parametroR_sErro.ParameterName = "R_sErro";
                parametroR_sErro.Direction = ParameterDirection.Output;
                parametroR_sErro.DbType = DbType.String;
                parametroR_sErro.Size = 4000;
                parametroR_sErro.Value = null;

                dbCommand.Parameters.Add(parametroR_sErro);

                DbParameter parametroR_sArgs = dbCommand.CreateParameter();
                parametroR_sArgs.ParameterName = "R_sArgs";
                parametroR_sArgs.Direction = ParameterDirection.Output;
                parametroR_sArgs.DbType = DbType.String;
                parametroR_sArgs.Size = 4000;
                parametroR_sArgs.Value = null;

                dbCommand.Parameters.Add(parametroR_sArgs);

                DbParameter parametrorettype = dbCommand.CreateParameter();
                parametrorettype.ParameterName = "R_Retorno";
                parametrorettype.Direction = ParameterDirection.Output;
                parametrorettype.DbType = DbType.Int32;
                parametrorettype.Value = 0;

                dbCommand.Parameters.Add(parametrorettype);

                #endregion

                #region Execução

                this.DataBase.ExecuteNonQuery(dbCommand);

                if (!Convert.ToBoolean(this.DataBase.GetParameterValue(dbCommand, "R_Retorno")))
                {
                    resultado.Sucesso = false;
                    resultado.CodigoErro = Convert.ToInt32(parametroR_nErro.Value);
                    resultado.Argumentos = Convert.ToString(parametroR_sArgs.Value);
                }
                else
                {
                    resultado.Sucesso = true;
                    resultado.DataMovimento = Convert.ToDateTime(parametroR_sNovaData.Value, new System.Globalization.CultureInfo("pt-BR"));
                }                

                #endregion
            }

            #endregion


            return resultado;
            
        }

        public BusinessEntity.Resultado RemontarCalendario(BusinessEntity.Parameter.FiltroRemontaCalendario entity)
        { 
            StringBuilder sql = new StringBuilder();

            sql.Append("DECLARE rettype BOOLEAN; ");
            sql.Append("BEGIN ");
            sql.Append("rettype:= pOr_Calend.fOr_Remonta_Calendario (:V_nEmpresa, :V_sSistema, :V_sControle ,:R_nErro,:R_sErro,:R_sArgs);");
            sql.Append("IF rettype THEN :R_Retorno := 1; ELSE :R_Retorno := 0; END IF; ");
            sql.Append("END; ");

            BusinessEntity.Resultado resultado = new BusinessEntity.Resultado();

            using (DbCommand command = this.DataBase.GetSqlStringCommand(sql.ToString()))
            {
                this.DataBase.AddInParameter(command, "V_nEmpresa", DbType.Int32, AuthorizationContext.Current.CompanyId);
                this.DataBase.AddInParameter(command, "V_sSistema", DbType.String, EnumConverter.ToString<BusinessEntity.Enum.TipoSistema>(entity.Sistema));
                this.DataBase.AddInParameter(command, "V_sControle", DbType.String, 'R');

                this.DataBase.AddOutParameter(command, "R_nErro", DbType.Int32, 4);
                this.DataBase.AddOutParameter(command, "R_sErro", DbType.String, 100);
                this.DataBase.AddOutParameter(command, "R_sArgs", DbType.String, 200);
                this.DataBase.AddOutParameter(command, "R_Retorno", DbType.Int32, 4);

                this.DataBase.ExecuteNonQuery(command);

                if (Convert.ToBoolean(this.DataBase.GetParameterValue(command, "R_Retorno")))
                {
                    resultado.Sucesso = true;
                }
                else
                {
                    resultado.Sucesso = false;
                    resultado.CodigoErro = Convert.ToInt32(this.DataBase.GetParameterValue(command, "R_nErro"));
                    resultado.Argumentos = Convert.ToString(this.DataBase.GetParameterValue(command, "R_sArgs"));
                }
            }

            return resultado;
        }
        #endregion
    }
}
